home *** CD-ROM | disk | FTP | other *** search
/ Aminet 45 / Aminet 45 (2001)(GTI - Schatztruhe)[!][Oct 2001].iso / Aminet / dev / e / 2b_CrtvE_src.lha / ident.s < prev    next >
Text File  |  2001-01-29  |  17KB  |  763 lines

  1. ;;IDENT
  2.  
  3. PARSEGETIDENTNR:          ; GETS IDENTNR OUTOF WORKBUF
  4.     TST.L   OBJECTD
  5.     BNE OBJECTIDENT
  6.  
  7.     MOVE.L  CPROC(PC),D3
  8.     MOVEQ   #0,D5
  9.     MOVEQ   #UNDEF,D7
  10.     MOVE.W  CURINS(PC),D6       ; INS-ioff
  11.  
  12.     CMP.W   #35,D4          ; .
  13.     BEQ .1
  14.     CMP.W   #IOFF+39,D4     ; TO
  15.     BEQ.S   .5
  16.     CMP.W   #19,D4          ; :
  17.     BEQ.S   .4
  18.     CMP.W   #IOFF+45,D4     ; OF
  19.     BEQ.S   .2
  20.     CMP.W   #IOFF+50,D4     ; SIZEOF
  21.     BEQ.S   .1
  22.     CMP.W   #41,D4          ; ::
  23.     BEQ.S   .1
  24.     BRA.S   XNEXT
  25. .5: CMP.W   #IOFF+44,-4(A1)     ; PTR TO
  26.     BNE.S   XNEXT
  27.     BRA OBJUSE
  28. .2: CMP.W   #IOFF+41,-4(A1)     ; ARRAY OF
  29.     BEQ.S   .1
  30.     CMP.W   #18,-4(A1)      ; ) OF
  31.     BNE.S   XNEXT
  32.     CMP.W   #1,-8(A1)       ; SELECT 1 OF (ERG DIRTY!)
  33.     BEQ.S   .XTEST
  34. .XBACK:
  35. .1: BRA OBJUSE
  36.  
  37. .XTEST: CMP.W   #IOFF+8,-10(A1)
  38.     BEQ.S   XNEXT
  39.     BRA.S   .XBACK
  40.  
  41. .4: CMP.W   #-1,D6
  42.     BNE.S   .1
  43.     CMP.W   #30,-4(A1)
  44.     BEQ.S   .1
  45. XNEXT:
  46.  
  47.     TST.W   D6          ; "PROC"=0
  48.     BNE.S   .1
  49.         CMP.W   #IOFF,D4        ;-2(A1) ; PROCNAME OR ARGVAR ?
  50.         BEQ.S   .2
  51.     MOVEQ   #LOCV,D7
  52.     BRA.S   .5
  53. .2: MOVEQ   #LAB,D7
  54.     BSR NEWPROC
  55.     BRA.S   .5
  56. .1: CMP.W   #16,D6
  57.     BNE.S   .3
  58.     MOVEQ   #GLOBV,D7
  59.     BRA.S   .5
  60. .3: CMP.W   #17,D6
  61.     BNE.S   .4
  62.     MOVEQ   #LOCV,D7
  63.     BRA.S   .5
  64. .4: CMP.B   #':',(A0)       ; DIRTY
  65.     BNE.S   .5
  66.     CMP.B   #'=',1(A0)
  67.     BEQ.S   .5
  68.     CMP.B   #':',1(A0)
  69.     BEQ.S   .5
  70.     MOVEQ   #LAB,D7
  71. .5: LEA IDENTHASH,A3
  72.     MOVE.L  HASHVAL,D1
  73.     LSL.L   #2,D1
  74.     ADD.L   D1,A3
  75.     MOVE.L  A3,IDHASHADR
  76.     ADDQ.L  #4,A3
  77.     MOVE.L  WORK(PC),D2     ; D2,D1=BACKUP
  78. IDCHECKLOOP:
  79.     MOVE.L  -(A3),A3
  80.     MOVE.L  A3,D1
  81.     BEQ UNIDENT
  82.     MOVE.L  A3,A5
  83.     MOVE.L  (A3),A4
  84.     MOVE.L  D2,A6
  85. .1: CMPM.B  (A4)+,(A6)+
  86.     BNE.S   IDCHECKLOOP
  87.     TST.B   -1(A4)
  88.     BNE.S   .1
  89.     CMPI.B  #LOCV,4(A5)
  90.     BNE.S   .2
  91.     MOVE.L  6(A5),D0        ; check if proc is ok
  92.     CMP.L   CPROC(PC),D0
  93.     BNE.S   IDCHECKLOOP
  94.     BRA.S   .3
  95. .2: CMPI.B  #LAB,4(A5)      ; check if redef loc/glob > lab
  96.     BNE.S   .3
  97.     CMP.W   #LOCV,D7
  98.     BEQ.S   IDCHECKLOOP
  99.     CMP.W   #GLOBV,D7
  100.     BEQ.S   IDCHECKLOOP
  101. .3: MOVE.L  A5,D5
  102.     CMPI.B  #GLOBV,4(A5)        ; check if locv > globv
  103.     BEQ.S   IDCHECKLOOP
  104.  
  105. ; HIERNA D4 TIJDLK. GETRASHED
  106.  
  107. IDALREADYPRESENT:
  108.     TST.W   D7          ; USE IN EXP
  109.     BEQ.W   .X2                     ; !!!!!!!!!!!!! WAS .X
  110.     MOVE.B  4(A5),D4        ; USE IN 'LOCAL'
  111.     CMP.B   #LOCV,D7
  112.     BNE.S   .10
  113.     TST.B   D4          ; var has type?
  114.     BNE.S   .2
  115.     MOVE.L  6(A5),D0
  116.     CMP.L   D3,D0
  117.     BNE.S   .X
  118.     MOVE.B  #LOCV,4(A5)     ; no: local
  119.     BRA.S   .X
  120. .2: CMP.B   #GLOBV,D4
  121.     BEQ UNIDENT2
  122.     CMP.B   #LOCV,D4
  123.     BNE iERROR21         ; LAB AS LOC OR LOC*2
  124.     CMP.L   6(A5),D3
  125.     BEQ iERROR21         ; same local name in other proc
  126.     BRA UNIDENT2
  127. .10:CMP.B   #LAB,D7         ; USE IN 'DEF'
  128.     BEQ.S   .20
  129.     CMP.B   #LOCV,D4
  130.     BEQ UNIDENT2
  131.     BTST    #2,5(A5)
  132.     BNE.S   .12
  133.     TST.B   D4
  134.     BNE iERROR21
  135.     BRA.S   .12B
  136. .12:    TST.W   EXPORTFLAG      ; allow bases to be redefined nonexport
  137.     BNE.S   .12B
  138.     BCLR    #2,5(A5)
  139. .12B:   MOVE.B  #GLOBV,4(A5)
  140.     BRA.S   .X
  141. .20:CMP.B   #":",(A0)       ; ONLY TEST LABELS, NOT PROCS/METHODS
  142.     BNE.S   .MH
  143.     CMP.B   #LAB,D4             ; OK THIS TEST?
  144.     BEQ iERROR14
  145. .MH:TST.B   D4                  ; USE IN 'PROC' OR ':'
  146.     BNE UNIDENT3
  147.     MOVE.B  #LAB,4(A5)
  148.     MOVE.W  #-1,10(A5)
  149. .X: MOVE.L  D3,6(A5)
  150. .X2:    MOVE.L  D4,D2
  151.     MOVEQ   #IDENT,D4
  152.     MOVE.W  D4,(A1)+
  153.     MOVE.L  D5,(A1)+
  154.     TST.W   MAXREGALLOC
  155.     BEQ.S   .NR
  156.     CMP.B   #LOCV,4(A5)
  157.     BNE.S   .NR
  158.     CMP.W   #23,D2          ; used in {}
  159.     BEQ.S   .NR2
  160.     TST.L   VARHEAVY(A5)
  161.     BEQ.S   .NR
  162.     MOVE.L  HEAVYNESS(PC),D0
  163.     ADD.L   D0,VARHEAVY(A5)
  164. .NR:    TST.B   D7
  165.     BEQ.S   .S
  166.     TST.W   EXPORTFLAG
  167.     BEQ.S   .NOEXP
  168.     BSET    #0,5(A5)        ; USED IF DEF+EXPORT
  169. .NOEXP: RTS
  170. .S: BSET    #0,5(A5)        ; SET IF USED
  171.     RTS
  172. .NR2:   CLR.L   VARHEAVY(A5)
  173.     BRA.S   .NR
  174.  
  175. UNIDENT3:
  176.     TST.L   10(A5)          ; see if objhead in procstruct
  177.     BEQ.W   iERROR21         ; no method!
  178.     MOVE.L  CPROC(PC),A6
  179.     BSET    #1,2(A6)        ; SET METHOD
  180.     BRA.S   UNIDENT2
  181. UNIDENT:
  182.     TST.L   D5
  183.     BNE DOUBLENAME
  184. UNIDENT2:
  185.     GETM    A3          ; A3=FRESH MEM
  186.     MOVE.L  WORK(PC),A4
  187.     MOVE.L  A3,A5           ; A5=ASCIIPTR IN HEAP
  188. .1: MOVE.B  (A4)+,(A3)+
  189.     BNE.S   .1
  190.     MOVE.L  A3,D0
  191.     BTST    #0,D0
  192.     BEQ.S   .OK
  193.     CLR.B   (A3)+
  194. .OK:
  195.     MOVE.L  IDHASHADR,A4
  196.     MOVE.L  (A4),(A3)+
  197.     MOVE.L  A3,(A4)
  198.     MOVEQ   #IDENT,D4
  199.     MOVE.W  D4,(A1)+
  200.     MOVE.L  A3,(A1)+
  201.     MOVE.L  A3,LASTID
  202.     MOVE.L  A3,A6           ; A6=BASE ID
  203.     MOVE.L  A5,(A3)+
  204.     MOVEQ   #0,D0
  205.     MOVE.B  D7,(A3)+        ; TST
  206.     BEQ .S
  207.     TST.W   EXPORTFLAG
  208.     BNE.S   .SE
  209.     CLR.B   (A3)+
  210.     BRA.S   .S2
  211. .SE:MOVE.B  #4,(A3)+        ; SET EXPORT
  212.     CMP.W   #2,D7
  213.     BEQ.S   .S2
  214.     BSET    #0,-1(A3)       ; +USED
  215.     BRA.S   .S2
  216. .S: MOVE.B  #1,(A3)+        ; SET FLAGS=1 IF USED (D7=0)
  217.                             ; ALS IDENT<>LABEL DAN ERROR22
  218. .S2:MOVE.L  D3,(A3)+
  219.     CMP.B   #LAB,D7
  220.     BEQ.S   .2
  221.     MOVE.W  D0,(A3)+        ; VARS:   OFFSET=0
  222.     CMP.B   #LOCV,D7
  223.     BNE.S   .3          ; SEE IF LOCAL --> HEAVYNESS
  224.     TST.W   MAXREGALLOC
  225.     BEQ.S   .3
  226.     TST.W   REGSTOP
  227.     BNE.S   .2A
  228.     MOVE.L  HEAVYNESS(PC),(A3)+ ; must be offs VARHEAVY
  229.     BRA.S   .3
  230. .2A:CLR.L   (A3)+           ; no regalloc in HANDLEr
  231.     BRA.S   .3
  232. .2: MOVE.W  #-1,(A3)+       ; LABELS: OFFSET=-1
  233. .3:
  234.     CMP.L   #"main",(A5)
  235.     BNE.S   .NM
  236.     TST.B   4(A5)
  237.     BNE.S   .NM
  238.     BSET    #0,5(A6)
  239.  
  240. .NM:    CMP.L   #"self",(A5)
  241.     BNE.S   .NS
  242.     TST.B   4(A5)
  243.     BNE.S   .NS
  244.     MOVE.L  A6,CURSELF
  245. .NS:MOVE.L  #0,(A3)+        ; 0 = DEF long
  246.     MOVE.L  #0,(A3)+
  247.     DONEM   A3
  248.     RTS
  249. DOUBLENAME:
  250.     MOVE.L  D5,A5
  251.     BRA IDALREADYPRESENT
  252.  
  253. LASTID:       DC.L    0
  254. IDHASHADR:    DC.L    0
  255. CURSELF:      DC.L    0
  256. SELFHASHADR:  DC.L    0
  257. SELFNAME:     DC.B    "self",0,0
  258.  
  259. NEWPROC:
  260.     GETM    A3
  261.     MOVE.L  PROCLIST(PC),(A3)+
  262.     MOVE.L  A3,PROCLIST
  263.     MOVE.L  A3,CPROC
  264.     MOVE.L  A3,D3
  265.     CLR.L   (A3)+
  266.     BTST    #0,CODEPREFS+1
  267.     BEQ.S   .1
  268.     TSTMOD
  269.     BNE.S   .1
  270.     BSET    #0,-2(A3)       ; USE RTD
  271. .1: CLR.W   (A3)+           ; FIRST 10 BYTES IN USE
  272.     CLR.L   (A3)+           ; DEFARGS
  273.     CLR.L   (A3)+           ; of_object
  274.     CLR.L   (A3)+           ; IDENT
  275.     CLR.L   (A3)+           ; SELF
  276.     CLR.L   (A3)+           ; METHOD
  277.     CLR.L   (A3)+           ; if regalloc then table
  278.     DONEM   A3
  279.     RTS
  280.  
  281. PROCLIST:   DC.L    0
  282. CPROC:      DC.L    0
  283. OBJNAME:    DC.L    0
  284.  
  285. FINDOBJ:              ; D1=ASCII, RET D0=OBJH | NIL
  286.     MOVEM.L A3/A4/A5,-(A7)
  287.     LEA OLIST+4(PC),A3
  288. .XL:MOVE.L  ONEXT(A3),A3
  289.     MOVE.L  A3,D0
  290.     BEQ.S   .X
  291.     MOVE.L  D1,A4
  292.     MOVE.L  OASCII(A3),A5       ; ASCII
  293. .L2:    CMPM.B  (A5)+,(A4)+
  294.     BNE.S   .XL
  295.     TST.B   -1(A5)
  296.     BNE.S   .L2
  297.     MOVE.L  A3,D0
  298. .X: MOVEM.L (A7)+,A3/A4/A5
  299.     RTS
  300.  
  301. OBJUSE:
  302.     CMP.W   #35,D4          ; SEARCHING OBJECTNAME OR FIELD
  303.     BEQ.S   .FIELD
  304.     MOVE.L  WORK(PC),D1     ; D1=ASCIIPTR
  305.     BSR FINDOBJ
  306.     CMP.W   #IOFF+50,D4
  307.     BEQ .000
  308. .001:
  309.     MOVEQ   #31,D4          ; FOUND
  310.     MOVE.W  D4,(A1)+
  311.     MOVE.L  D0,(A1)+
  312.     BEQ iERROR42
  313.     RTS
  314. .000:
  315.     TST.W   D0
  316.     BNE .001
  317.     BRA XNEXT
  318.  
  319. .FIELD: MOVE.L  WORK(PC),D1     ; IS THIS PART NECESSARY ?
  320.     LEA MEMBERLIST+4(PC),A3
  321. .FL:    MOVE.L  ONEXT(A3),A3
  322.     MOVE.L  A3,D0
  323.     BEQ .MODF
  324.     MOVE.L  D1,A4
  325.     MOVE.L  OASCII(A3),A5
  326.     MOVE.L  A5,D0           ; SKIP IF PRIVATE
  327.     BEQ.S   .FL
  328. .FL2:   CMPM.B  (A5)+,(A4)+
  329.     BNE.S   .FL
  330.     TST.B   -1(A5)
  331.     BNE.S   .FL2
  332.     MOVEQ   #39,D4
  333.     MOVE.W  D4,(A1)+
  334.     MOVE.L  A3,(A1)+
  335.     RTS
  336. .MODF:  MOVE.L  WORK(PC),D1     ; SEARCH IN "MODULE" LIST
  337.     LEA OLIST+4(PC),A3      ; (AFTER OWN OBJECTS!)
  338. .MFL:   MOVE.L  ONEXT(A3),A3
  339.     MOVE.L  A3,D0
  340.     BEQ .UNF
  341.     LEA OMEMB+4(A3),A6
  342. .ML:    MOVE.L  ONEXT(A6),A6
  343.     MOVE.L  A6,D0
  344.     BEQ.S   .MFL
  345.     MOVE.L  D1,A4
  346.     MOVE.L  OASCII(A6),A5
  347.     MOVE.L  A5,D0           ; SKIP IF PRIVATE
  348.     BEQ.S   .ML
  349. .ML2:   CMPM.B  (A5)+,(A4)+
  350.     BNE.S   .ML
  351.     TST.B   -1(A5)
  352.     BNE.S   .ML2
  353.     MOVEQ   #39,D4
  354.     MOVE.W  D4,(A1)+
  355.     MOVE.L  A6,(A1)+
  356.     RTS
  357. .UNF:   MOVEQ   #42,D4          ; NOT FOUND SOFAR
  358.     MOVE.W  D4,(A1)+
  359.     GETM    A3
  360.     MOVE.L  A3,(A1)+
  361.     MOVE.L  WORK(PC),A4
  362. .UFL:   MOVE.B  (A4)+,(A3)+     ; KAN DUS NIET!!!
  363.     BNE.S   .UFL            ; DOUBLE COPY
  364.     MOVE.L  A3,D1
  365.     BTST    #0,D1
  366.     BEQ.S   .UF2
  367.     ADDQ.L  #1,A3
  368. .UF2:   DONEM   A3
  369.     RTS
  370.  
  371.  
  372. OLIST:        DC.L    0
  373. MEMBERLIST:   DC.L    0   ; TIJDENS LEX
  374.  
  375. OBJECTIDENT:          ; definition
  376.     CMP.W   #19,D4          ; 2. bla:INT IPV x:bla
  377.     BEQ.S   .S
  378.     CMP.W   #IOFF+39,D4     ; TO
  379.     BEQ.S   .S
  380.     CMP.W   #IOFF+45,D4     ; OF
  381.     BNE     .NEW
  382. .S: MOVE.L  WORK(PC),A5
  383.     MOVE.L  A5,D5
  384.     LEA OLIST+4(PC),A6      ; A6=LINKED LIST
  385. .XL:MOVE.L  ONEXT(A6),A6
  386.     MOVE.L  A6,D0
  387.     BEQ.S   .MUT
  388.     MOVE.L  OASCII(A6),A4
  389.     MOVE.L  D5,A5
  390. .COMP:  CMPM.B  (A5)+,(A4)+
  391.     BNE.S   .XL
  392.     TST.B   -1(A5)
  393.     BNE.S   .COMP
  394.     CMP.W   #IOFF+48,D4     ; 1. OBJECT <DOUBLEDECL>
  395.     BEQ iERROR43
  396.     MOVEQ   #31,D4          ; FOUND
  397.     MOVE.W  D4,(A1)+
  398.     MOVE.L  A6,(A1)+
  399.     RTS
  400. .MUT:   CMP.W   #IOFF+39,D4     ; ONLY "TO". ILLEGAL = "OF", ":"
  401.     BNE iERROR42
  402.     MOVEQ   #45,D4
  403.     MOVE.W  D4,(A1)+
  404.     GETM    A3
  405.     MOVE.L  A3,(A1)+
  406.     MOVE.L  D5,A5
  407. .MUTL:  MOVE.B  (A5)+,(A3)+
  408.     BNE.S   .MUTL
  409.     MOVE.L  A3,D0
  410.     ADDQ.L  #1,D0
  411.     BCLR    #0,D0
  412.     MOVE.L  D0,A3
  413.     DONEM   A3
  414.     RTS
  415. .NEW:   MOVEQ   #0,D0           ; IF D0=1 THEN OHEAD, 0=MEMBER
  416.     CMP.W   #IOFF+48,D4
  417.     BNE.S   .1
  418.     MOVEQ   #1,D0
  419. .1: GETM    A3
  420.     TST.W   D0
  421.     BNE .5
  422.     TST.L   OBJNAME
  423.     BEQ iERROR39
  424. .3: MOVE.L  WORK(PC),A2
  425.     MOVE.L  A3,D1           ; D1=ASCPTR
  426. .2: MOVE.B  (A2)+,(A3)+
  427.     BNE.S   .2
  428.     MOVE.L  A3,D4
  429.     BTST    #0,D4
  430.     BEQ.S   .OK
  431.     CLR.B   (A3)+
  432. .OK:    MOVE.L  A3,A4           ; STILL ON HEAP
  433.     MOVEQ   #31,D4
  434.     MOVE.W  D4,(A1)+
  435.     ADDQ.L  #4,A4
  436.     MOVE.L  A4,(A1)+
  437.     TST.L   D0
  438.     BEQ.S   .MEM
  439.     MOVE.L  OLIST(PC),ONEXT(A4) ; OBJECTHEAD STRUCT
  440.     MOVE.L  A4,OLIST
  441.     CLR.L   (A4)+           ; DELEGATESIZE+FLAGS
  442.     CLR.L   (A4)+           ; SIZEOF+ID
  443.     MOVE.L  D1,(A4)+        ; ASCII
  444.     CLR.L   (A4)+           ; MEMBERLIST=0
  445.     CLR.L   (A4)+           ; METHODLIST=0
  446.     CLR.L   (A4)+           ; SUPERCLASS=0
  447.     MOVE.L  #1,(A4)+        ; DELEGATECODE=1
  448.     CLR.L   (A4)+           ; ACCESLIST
  449.     MOVE.L  #-1,(A4)+       ; DELOFFSET+DESTRUCTOFF
  450.     BRA.S   .C
  451. .MEM:   MOVEQ   #39,D4
  452.     MOVE.W  D4,-6(A1)
  453.     MOVE.L  MEMBERLIST(PC),ONEXT(A4); (NEXT) MEMBER STRUCT
  454.     MOVE.L  A4,MEMBERLIST
  455.     CLR.L   (A4)+
  456.     CLR.L   (A4)+
  457.     MOVE.L  D1,(A4)+
  458.     CLR.L   (A4)+           ; OPTRTYPE
  459.     CLR.L   (A4)+           ; info (used?)
  460.     CLR.L   (A4)+           ; next (INT!!!)
  461. .C: DONEM   A4
  462.     RTS
  463. .5: MOVE.L  A3,OBJNAME
  464.     MOVE.L  WORK(PC),D1
  465.     BSR FINDOBJ
  466.     TST.L   D0
  467.     BNE iERROR43
  468.     MOVEQ   #1,D0
  469.     BRA .3
  470.  
  471. PARSEGETVALUE:            ; A2 STRING, =>D0 LONGINT
  472.     TST.B   (A2)+
  473.     BNE.S   PARSEGETVALUE
  474.     SUBQ.L  #1,A2
  475.     MOVEQ   #0,D0           ; RESULT
  476.     CMPA.L  #WORKBUF+11,A2
  477.     BPL iERROR7
  478.     LEA VALUETAB(PC),A3
  479.     MOVEQ   #0,D7
  480. .1: MOVEQ   #0,D3
  481.     MOVE.L  (A3)+,D2
  482.     MOVE.B  -(A2),D3
  483.     SUB.W   #48,D3
  484.     BMI.S   .2          ; DAMN! WERE DOING A FLOAT!
  485.     MOVE.L  D3,D1
  486.     MULU    D2,D3
  487.     SWAP    D2
  488.     MULU    D2,D1
  489.     SWAP    D1
  490.     ADD.L   D1,D3
  491.     ADD.L   D3,D0
  492.     BCS iERROR7
  493. .3: CMPA.L  WORK(PC),A2
  494.     BNE.S   .1
  495.     TST.L   D7          ; NEED TO CONVERT FLOAT?
  496.     BNE.S   .4
  497.     RTS             ; NO
  498. .4: MOVE.L  D0,D6
  499.     MOVEM.L A0/A1,-(A7)
  500.     BSR ISOPENMATH
  501.     MOVE.L  MATHBASE(PC),A6     ; YES
  502.     MOVE.L  D6,D0
  503.     JSR -36(A6)         ; SPFLT
  504.     CMP.L   #1,D7
  505.     BEQ.S   .5
  506.     MOVE.L  D0,D6
  507.     MOVE.L  D7,D0
  508.     JSR -36(A6)
  509.     MOVE.L  D6,D1
  510.     EXG.L   D0,D1
  511.     MOVE.W  #-1,IEEEPROBLEM
  512.     JSR -84(A6)         ; SPDIV
  513.     CLR.W   IEEEPROBLEM
  514. .5: MOVEM.L (A7)+,A0/A1
  515.     RTS
  516. .2: TST.L   D7
  517.     BNE iERROR0
  518.     MOVE.L  D2,D7           ; = FLT FACTOR
  519.     SUBQ.L  #4,A3
  520.     BRA.S   .3
  521.  
  522. IEEEPROBLEM:  DC.W    0
  523.  
  524. VALUETAB:
  525.     DC.L    1,10,100,1000,10000,100000,1000000
  526.     DC.L    10000000,100000000,1000000000
  527.  
  528.  
  529.  
  530.  
  531.  
  532.  
  533. PARSESTRING:
  534.     MOVEQ   #STR,D4
  535.     MOVE.W  D4,(A1)+
  536.     ADDQ.L  #4,A1
  537.     MOVE.L  A1,A4
  538. .LOOP:  MOVE.B  (A0)+,D0
  539.     CMP.B   #10,D0
  540.     BEQ.S   .ER
  541.     CMP.B   #'\',D0
  542.     BEQ.S   .SPEC
  543. ;    CMP.B   #'%',D0
  544. ;    BEQ.S   .PERC
  545.     MOVE.B  D0,(A1)+
  546.     CMP.B   #"'",D0
  547.     BNE.S   .LOOP
  548.     CMP.B   #"'",(A0)
  549.     BEQ.S   .DQUO
  550.     SUBQ.L  #1,A1
  551.     MOVE.L  A1,D1
  552.     MOVE.B  #0,(A1)+
  553.     MOVE.L  A1,D0
  554.     BTST    #0,D0
  555.     BEQ.S   .EQSTR
  556.     MOVE.B  #0,(A1)+
  557. .EQSTR: SUB.L   A4,D1
  558.     MOVE.L  A1,D0
  559.     SUB.L   A4,D0
  560.     ASR.L   #1,D0
  561.     MOVE.W  D0,-2(A4)
  562.     MOVE.W  D1,-4(A4)       ; REAL LEN
  563.     MOVE.L  STRLENADR,A3
  564.     MOVE.L  D1,(A3)
  565.     BRA PARSELOOP
  566. .PERC:  TST.W   XF
  567.     BEQ.S   .SK
  568.     MOVE.B  #"%",(A1)+
  569. .SK:    MOVE.B  #"%",(A1)+
  570.     BRA .LOOP
  571. .DQUO:  ADDQ.L  #1,A0
  572.     BRA .LOOP
  573. .ER:    SUBQ.L  #1,A0
  574.     BRA iERROR8
  575.  
  576. .SPEC:  MOVE.B  (A0)+,D1
  577.     CMP.B   #'n',D1
  578.     BEQ     .1
  579.     CMP.B   #'a',D1
  580.     BEQ     .2
  581.     CMP.B   #'e',D1
  582.     BEQ     .3
  583.     CMP.B   #'t',D1
  584.     BEQ     .4
  585.     CMP.B   #'\',D1
  586.     BEQ     .5
  587.     CMP.B   #'0',D1
  588.     BEQ     .6
  589.     CMP.B   #'b',D1
  590.     BEQ     .14
  591.     CMP.B   #'d',D1
  592.     BEQ     .7
  593.     CMP.B   #'h',D1
  594.     BEQ     .8
  595.     CMP.B   #'s',D1
  596.     BEQ     .9
  597.     CMP.B   #'z',D1
  598.     BEQ     .10
  599.     CMP.B   #'l',D1
  600.     BEQ     .11
  601.     CMP.B   #'r',D1
  602.     BEQ     .12
  603.     CMP.B   #'c',D1
  604.     BEQ     .13
  605.     CMP.B   #'q',D1
  606.     BEQ     .15
  607.     CMP.B   #'!',D1
  608.     BEQ     .16
  609.     CMP.B   #'v',D1
  610.     BEQ     .17
  611.     CMP.B   #'x',D1
  612.     BEQ     .18
  613.     CMp.B   #"u",D1
  614.     BEQ     .19
  615.     BRA iERROR26
  616. .1: MOVE.B  #10,(A1)+
  617.     BRA .LOOP
  618. .2: MOVE.B  #"'",(A1)+
  619.     BRA .LOOP
  620. .3: MOVE.B  #27,(A1)+
  621.     BRA .LOOP
  622. .4: MOVE.B  #9,(A1)+
  623.     BRA .LOOP
  624. .5: MOVE.B  #"\",(A1)+
  625.     BRA .LOOP
  626. .6: MOVE.B  #0,(A1)+
  627.     BRA .LOOP
  628. .7: MOVE.B  #'%',(A1)+
  629.     BSR     DOFIELD
  630.     MOVE.B  #'l',(A1)+
  631.     MOVE.B  #'d',(A1)+
  632.     BRA .LOOP
  633. .8: MOVE.B  #'%',(A1)+
  634.     BSR     DOFIELD
  635.     MOVE.B  #'l',(A1)+
  636.     MOVE.B  #'x',(A1)+
  637.     BRA .LOOP
  638. .9: MOVE.B  #'%',(A1)+
  639.     BSR     DOFIELD
  640.     MOVE.B  #'s',(A1)+
  641.     BRA .LOOP
  642. .10:    MOVE.W  #-1,FZERO
  643.     BRA .LOOP
  644. .11:    MOVE.W  #-1,FRL
  645.     BRA .LOOP
  646. .12:    MOVE.W  #0,FRL
  647.     BRA .LOOP
  648. .13:    MOVE.B  #'%',(A1)+
  649.     MOVE.B  #'l',(A1)+
  650.     MOVE.B  #'c',(A1)+
  651.     BRA .LOOP
  652. .14:    MOVE.B  #13,(A1)+
  653.     BRA .LOOP
  654. .15:    MOVE.B  #34,(A1)+
  655.     BRA .LOOP
  656. .16:    MOVE.B  #7,(A1)+
  657.     BRA .LOOP
  658. .17:    MOVe.B  #11,(A1)+
  659.     BRA .LOOP
  660. .18:
  661.     MOVEM.L D0/D2,-(A7)
  662.     MOVEQ   #1,D1
  663.     MOVEQ   #0,D2
  664. .18_1:
  665.     LSL.B   #4,D2
  666.     MOVE.B  (A0)+,D0
  667.     CMP.B   #"0",D0
  668.     BLT     iERROR72
  669.     CMP.B   #"9",D0
  670.     BLE     .DEC
  671.     CMP.W   #"A",D0
  672.     BLT     iERROR72
  673.     CMP.W   #"F",D0
  674.     BLE     .HEX
  675.     CMP.W   #"a",D0
  676.     BLT     iERROR72
  677.     CMP.W   #"f",D0
  678.     BGT     iERROR72
  679. .HEX:
  680.     BCLR    #5,D0
  681.     AND.L   #$FF,D0
  682.     SUB.B   #"A",D0
  683.     ADD.B   #10,D0
  684.     BRA     .CNT
  685. .DEC:
  686.     AND.L   #$FF,D0
  687.     SUB.B   #"0",D0
  688. .CNT:
  689.     ADD.W   D0,D2
  690.     DBF     D1,.18_1
  691.     MOVE.B  D2,(A1)+
  692.     MOVEM.L (A7)+,D0/D2
  693.     BRA .LOOP
  694. .19:
  695.     MOVE.B  #"%",(A1)+
  696.     BSR     DOFIELD
  697.     MOVE.W  #"lu",(A1)+
  698.     BRA .LOOP
  699.  
  700.  
  701. FZERO:  DC.W    0           ; 0=PADSPACE, -1=PADZERO
  702. FRL:    DC.W    0           ; 0=RIGHT, -1=LEFT
  703. SSTR:   DC.L    0
  704.  
  705. DOFIELD:
  706.     TST.W   FRL
  707.     BEQ.S   .1
  708.     MOVE.B  #'-',(A1)+
  709. .1: TST.W   FZERO
  710.     BEQ.S   .2
  711.     MOVE.B  #'0',(A1)+
  712. .2: CMP.B   #'(',(A0)
  713.     BNE.S   .5
  714.     MOVE.L  A0,SSTR
  715.     ADDQ.L  #1,A0
  716. .4: MOVE.B  (A0)+,D1
  717.     CMP.B   #')',D1
  718.     BEQ.S   .5
  719.     CMP.B   #',',D1
  720.     BNE.S   .3
  721.     MOVE.B  #'.',(A1)+
  722.     BRA.S   .4
  723. .3: CMP.B   #58,D1
  724.     BPL.S   .F
  725.     CMP.B   #48,D1
  726.     BMI.S   .F
  727.     MOVE.B  D1,(A1)+
  728.     BRA.S   .4
  729. .F: MOVE.L  SSTR(PC),A0
  730. .5: CMP.B   #'[',(A0)
  731.     BEQ.S   .7
  732. .6: MOVE.W  #0,FZERO
  733.     RTS
  734. .7: MOVE.L  WORK(PC),A5
  735.     MOVE.L  A5,D5
  736.     MOVE.L  A0,SSTR
  737.     ADDQ.L  #1,A0
  738. .8: MOVE.B  (A0)+,D1
  739.     CMP.B   #58,D1
  740.     BPL.S   .X
  741.     CMP.B   #48,D1
  742.     BMI.S   .X
  743.     MOVE.B  D1,(A5)+
  744.     BRA.S   .8
  745. .X: CMP.B   #']',D1
  746.     BNE.S   .F2
  747.     CMP.L   D5,A5
  748.     BEQ.S   .6
  749.     MOVE.B  #0,(A5)+
  750.     MOVE.L  D5,A5
  751. .XL:MOVE.B  (A5)+,(A1)+
  752.     BNE.S   .XL
  753.     MOVE.B  #'.',-1(A1)
  754.     MOVE.L  D5,A5
  755. .L2:    MOVE.B  (A5)+,(A1)+
  756.     BNE.S   .L2
  757.     SUBQ.L  #1,A1
  758.     BRA.S   .6
  759. .F2:    MOVE.L  SSTR(PC),A0
  760.     BRA.S   .6
  761. ;*-*
  762.  
  763.